package br.com.edoc.controller.portal;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;

import org.primefaces.component.menuitem.MenuItem;
import org.primefaces.component.submenu.Submenu;
import org.primefaces.model.DefaultMenuModel;
import org.primefaces.model.MenuModel;



import br.com.edoc.controller.ControllerPadrao;
import br.com.edoc.entidade.Menu;
import br.com.edoc.entidade.Modulo;
import br.com.edoc.entidade.PermissaoUsuario;
import br.com.edoc.entidade.Usuario;
import br.com.edoc.gerentes.GerenteControleAcesso;
@ManagedBean(name="portal")
@SessionScoped
public class PortalController extends ControllerPadrao{

	/**
	 * 
	 */
	private Usuario usuario;

	private List<Modulo> listaModulos;

	private Modulo moduloCurrent;

	private MenuModel modelMenuDock;

	private MenuModel modelMenuFuncionalidade;

	private HashMap<Integer, Submenu> hashSubMenu;
	
	private HashMap<Integer, PermissaoUsuario> hashPermissao;
	
	private String teste;

	private static final long serialVersionUID = -1826779747066381912L;





	public PortalController(Usuario usuario,List<Modulo> lista){
		this.usuario = usuario;
		this.listaModulos = lista;		
		this.getSessionScope().put("portal", this);
		setModelMenuDock(new DefaultMenuModel());
		for(Modulo modulo: getListaModulos()){
			MenuItem itenMenu = new MenuItem();
			itenMenu.setValue(modulo.getNome());
			itenMenu.addActionListener(createActionListener("#{portal.changeModulo}"));			
			//itenMenu.setUrl(modulo.getUrl());
			itenMenu.setId("dockModId-"+modulo.getId());
			itenMenu.setIcon("../img/modulo/"+modulo.getImg());
			itenMenu.setUpdate("topoMenu");
			getModelMenuDock().addMenuItem(itenMenu);		
		}
	}
	public void changeModulo(ActionEvent event){
		Modulo modulo = new Modulo();
		modulo.setId(Integer.parseInt(event.getComponent().getId().split("-")[1]));
		setModuloCurrent(listaModulos.get(getListaModulos().indexOf(modulo)));
		showInFormPopUp("changeModulo");
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	public void desenhaArvoreMenu(Menu menu){
		if(menu.getMother()!=null)
			desenhaArvoreMenu(menu.getMother());
		if(!getHashSubMenu().containsKey(menu.getId())){
			Submenu sub = new Submenu();
			sub.setLabel(menu.getDescricao());	
			sub.setId("menuFuncionalidadeSubMenu-"+menu.getId());
			if(menu.getMother()==null){
				
				getModelMenuFuncionalidade().addSubmenu(sub);
				getHashSubMenu().put(menu.getId(), sub);
			}
			else{
				Submenu subMother = getHashSubMenu().get(menu.getMother().getId());
				subMother.getChildren().add(sub);
				getHashSubMenu().put(menu.getId(), sub);
			}
		}
	}
	public String redirectModulo(){
		GerenteControleAcesso gc = getAtendente().chamaGerenteControleAcesso();
		List<PermissaoUsuario> listaMenus = gc.findByPermissaoForUsuarioModulo(getUsuario(), getModuloCurrent());
		setModelMenuFuncionalidade(new DefaultMenuModel());
		setHashSubMenu(null);
		for(PermissaoUsuario permissao :listaMenus){
			desenhaArvoreMenu(permissao.getMenu().getMother());
			MenuItem  menuIten = new MenuItem();
			menuIten.setValue(permissao.getMenu().getDescricao());
			menuIten.setId("menuFuncionalidade-"+permissao.getId());
			menuIten.addActionListener(createActionListener("#{portal.actionPermission}"));
			menuIten.setAjax(false);
			Submenu subMother = getHashSubMenu().get(permissao.getMenu().getMother().getId());
			subMother.getChildren().add(menuIten);
			getHashPermissao().put(permissao.getId(), permissao);
		}
		MenuItem  menuSairModulo = new MenuItem();
		menuSairModulo.setValue("Sair do Modulo");
		menuSairModulo.setId("menuFuncionalidadeExitModulo");
		menuSairModulo.setActionExpression(createAction("#{portal.exitModulo}",String.class));
		menuSairModulo.setAjax(false);
		
		MenuItem  menuSairSistema = new MenuItem();
		menuSairSistema.setValue("Sair do sistema");
		menuSairSistema.setId("menuFuncionalidadeExitSistema");
		menuSairSistema.setActionExpression(createAction("#{portal.logoff}",String.class));
		menuSairSistema.setAjax(false);
		Submenu subMenuSair = new Submenu();
		subMenuSair.setLabel("Sair");	
		subMenuSair.setId("subFuncionalidadeExitSistema");
		subMenuSair.getChildren().add(menuSairModulo);
		subMenuSair.getChildren().add(menuSairSistema);
		getModelMenuFuncionalidade().addSubmenu(subMenuSair);
		return getModuloCurrent().getUrl();
	}
	public void actionPermission(ActionEvent event){
		PermissaoUsuario permissao =getHashPermissao().get(Integer.parseInt(event.getComponent().getId().split("-")[1]));
		FacesContext context = FacesContext.getCurrentInstance();
 		context.getApplication().getNavigationHandler().handleNavigation(context, null,permissao.getMenu().getUrl());
	}
	public List<Modulo> getListaModulos() {
		if(listaModulos == null){
			listaModulos = new ArrayList<Modulo>();
		}
		return listaModulos;
	}

	public void setListaModulos(List<Modulo> listaModulos) {
		this.listaModulos = listaModulos;
	}

	public MenuModel getModelMenuDock() {
		return modelMenuDock;
	}

	public void setModelMenuDock(MenuModel modelMenuDock) {
		this.modelMenuDock = modelMenuDock;
	}
	public MenuModel getModelMenuFuncionalidade() {
		return modelMenuFuncionalidade;
	}
	public void setModelMenuFuncionalidade(MenuModel modelMenuFuncionalidade) {
		this.modelMenuFuncionalidade = modelMenuFuncionalidade;
	}
	public Modulo getModuloCurrent() {
		return moduloCurrent;
	}
	public void setModuloCurrent(Modulo moduloCurrent) {
		this.moduloCurrent = moduloCurrent;
	}
	
	

	public String exitModulo(){
		setModuloCurrent(null);
		return "../login/index.jsf";
	}
	public String logoff(){
		FacesContext facesContext = FacesContext.getCurrentInstance();  
		HttpSession session = (HttpSession) facesContext .getExternalContext().getSession(false);  
		session.invalidate(); 
		return "logoff";
	}
	
	public String getTeste() {
		return teste;
	}
	public void setTeste(String teste) {
		this.teste = teste;
	}
	
	public HashMap<Integer, PermissaoUsuario> getHashPermissao() {
		if(hashPermissao == null){
			hashPermissao = new HashMap<Integer, PermissaoUsuario>();
		}
		return hashPermissao;
	}
	public void setHashPermissao(HashMap<Integer, PermissaoUsuario> hashPermissao) {
		this.hashPermissao = hashPermissao;
	}
	
	public HashMap<Integer, Submenu> getHashSubMenu() {
		if(hashSubMenu == null){
			hashSubMenu = new HashMap<Integer, Submenu>();
		}
		return hashSubMenu;
	}
	public void setHashSubMenu(HashMap<Integer, Submenu> hashSubMenu) {
		this.hashSubMenu = hashSubMenu;
	}
}
